﻿//-----------------------------------------------------------------------
// <copyright company="www.3WayWebdesign.de">
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
//
// <author>Michael Morbach</author>
// <email>Michael@3waywebdesign.de</email>
// <web>http://www.3waywebdesign.de</web>
//-----------------------------------------------------------------------

namespace Tww.MAF.MAFMenuBarModule.ViewModels
{
    #region Imports

    using GalaSoft.MvvmLight;
    using GalaSoft.MvvmLight.Command;
    using Microsoft.Practices.Unity;
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Input;
    using Tww.MAF.MAFInfrastructure.Interfaces.Services;
    using Tww.MAF.MAFInfrastructure.Interfaces.ViewModels;
    using Tww.MAF.MAFInfrastructure.Models.UI;
    using Tww.MAF.MAFInfrastructure.Models.UI.Menu;


    #endregion

    public class MenuBarViewModel : ViewModelBase, IMenuBarViewModel
    {
        #region Private Fields

        /** Commands **/
        private ICommand menuItemClickedCommand;

        private ObservableCollection<IMenuTreeEntry> menuItems;
        private IMenuTreeEntry currentSelectedNode;

        #endregion

        #region Ctors

        public MenuBarViewModel( IUnityContainer unityContainer )
        {
            this.UnityContainer = unityContainer;
            this.menuItems = new ObservableCollection<IMenuTreeEntry>();
            this.menuItems.CollectionChanged += ( sender, e ) => { this.RaisePropertyChanged<ReadOnlyObservableCollection<IMenuTreeEntry>>( () => MenuItems ); };
            this.MenuItems = new ReadOnlyObservableCollection<IMenuTreeEntry>( this.menuItems );
        }

        #endregion

        #region Commands

        public ICommand MenuItemClickedCommand
        {
            get
            {
                if ( menuItemClickedCommand == null )
                {
                    menuItemClickedCommand = new RelayCommand( () => this.UnityContainer.Resolve<IMenuBarService>().PublishMenuItemClicked( this.CurrentSelectedNode ), () => true );
                }

                return menuItemClickedCommand;
            }
        }

        #endregion

        #region Public Properties

        public ReadOnlyObservableCollection<IMenuTreeEntry> MenuItems
        {
            get;
            private set;
        }

        public IMenuTreeEntry CurrentSelectedNode
        {
            get { return currentSelectedNode; }
            private set
            {
                this.currentSelectedNode = value;
                this.RaisePropertyChanged<IMenuTreeEntry>( () => CurrentSelectedNode );
            }
        }

        #endregion

        #region Private Properties

        protected IUnityContainer UnityContainer { get; set; }

        #endregion

        #region Methods

        public void AddTabItem( IMenuTreeEntry treeRootItem )
        {
            if ( !this.menuItems.Contains( treeRootItem ) )
            {
                this.menuItems.Add( treeRootItem );
            }
        }

        public void RemoveTabItem( IMenuTreeEntry treeRootItem )
        {
            if ( this.menuItems.Contains( treeRootItem ) )
            {
                this.menuItems.Remove( treeRootItem );
            }
        }

        public void ClearTree()
        {
            this.menuItems.Clear();
        }

        #endregion
    }
}
